#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
#include <QDir>
#include <QFileDialog>
#include <dwgobject.h>
#include <dwgpoint.h>
#include <QMouseEvent>
#include <dwgline.h>
#include <dwgcircleone.h>
#include <dwgcircletwo.h>
#include <dwgcircle.h>
#include <dwgrectangle.h>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 下面这段用于设置File子页面中的布局和控件的位置
    ui->tabWidget->setFixedHeight(80);     // 设置QTabWidget控件的高度

    ui->FileHLayout->setAlignment(Qt::AlignLeft); // 把File子页面中的布局设计左对齐
    ui->FileHLayout->setAlignment(Qt::AlignTop);  // 把File子页面中的布局设计上对齐
    ui->FileHLayout->setContentsMargins(0,0,0,0);  // 设置布局与子页面四边的间距为0
    ui->FileHLayout->setSpacing(0);                // 设置布局中各控件之间的间距为0

    //  下面的代码，把在UI中添加的QToolButton控件与QAction动作连接起来
    ui->NewTB->setDefaultAction(ui->actionNew);
    ui->OpenTB->setDefaultAction(ui->actionOpen);
    ui->SaveTB->setDefaultAction(ui->actionSave);
    ui->SaveAsTB->setDefaultAction(ui->actionSaveAs);
    ui->ExitTB->setDefaultAction(ui->actionExit);

    ui->FileTab->setLayout(ui->FileHLayout);		// 通过本语句让布局布满Tab子页面
    //实现DrawTB子页面的按钮
    QHBoxLayout *drawHL1 = new QHBoxLayout;               // 我们先设计一个横排列的布局，用于排列绘图控件
    drawHL1->setAlignment(Qt::AlignLeft);					//  左对齐
    drawHL1->setAlignment(Qt::AlignTop);                       //  顶对齐
    drawHL1->setContentsMargins(0,0,0,0);				     //  四边距为0
    drawHL1->setSpacing(0);                                  //  内部控件间距为0

    // 下面这一段代码主要用于设计一个QToolButton类型的按钮控件，并把它添加到布局中
    QToolButton *pointTB = new QToolButton;                     // 第一个控件，画点
    pointTB->setToolButtonStyle(Qt::ToolButtonIconOnly);        // 控件样式设计为只显示图标
    pointTB->setFixedSize(QSize(32,32));                         // 指定图标的大小为 32x32 像素
    pointTB->setText("Point");                                  // 同时也设置了控件的显示名称
    pointTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon pointIcon = QIcon::fromTheme("Point", QIcon(":/icons/picture/Target1.png")); //资源文件中的点图标
    pointTB->setIcon(pointIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(pointTB,&QToolButton::clicked,this,&MainWindow::pointTB_clicked); // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(pointTB);                                // 把这个按钮添加到布局中

    QToolButton *rectangleTB = new QToolButton;                     // 第一个控件，画点
    rectangleTB->setToolButtonStyle(Qt::ToolButtonIconOnly);        // 控件样式设计为只显示图标
    rectangleTB->setFixedSize(QSize(32,32));                         // 指定图标的大小为 32x32 像素
    rectangleTB->setText("Point");                                  // 同时也设置了控件的显示名称
    rectangleTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon rectangleIcon = QIcon::fromTheme("Rectangle", QIcon(":/icons/picture/Restangle.png")); //资源文件中的点图标
    rectangleTB->setIcon(rectangleIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(rectangleTB,&QToolButton::clicked,this,&MainWindow::rectangleTB_clicked); // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(rectangleTB);                                // 把这个按钮添加到布局中

    ui->DrawTab->setLayout(drawHL1);
    QToolButton *lineTB = new QToolButton;                     // 第一个控件，画点
    lineTB->setToolButtonStyle(Qt::ToolButtonIconOnly);        // 控件样式设计为只显示图标
    lineTB->setFixedSize(QSize(32,32));                         // 指定图标的大小为 32x32 像素
    lineTB->setText("Line");                                  // 同时也设置了控件的显示名称
    lineTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon linetIcon = QIcon::fromTheme("Line", QIcon(":/icons/picture/Line.png")); // 资源文件中的线的图标
    lineTB->setIcon(linetIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(lineTB,&QToolButton::clicked,this,&MainWindow::lineTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(lineTB);

    QToolButton *circleTB =new QToolButton;
    circleTB->setToolButtonStyle(Qt::ToolButtonIconOnly);        // 控件样式设计为只显示图标
    circleTB->setIconSize(QSize(32,32));                         // 指定图标的大小为 32x32 像素
    circleTB->setText("Circle");                                  // 同时也设置了控件的显示名称
    circleTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    circleTB->setPopupMode(QToolButton::MenuButtonPopup);
    const QIcon circleIcon = QIcon::fromTheme("Circle", QIcon(":/icons/picture/Circle.png"));   // 这是资源文件中的点的图标
    circleTB->setIcon(circleIcon);                                // 把这个点的图标设置给QToolButton按钮

    QMenu * circleMenu = new QMenu;               // 为以叠加图标，需要构建菜单再添加动作
    QAction * cirAct1 = new QAction(QIcon(":/icons/picture/Circle.png"),"圆心半径");
    QAction * cirAct2 = new QAction(QIcon(":/icons/picture/Circle.png"),"两点画圆");
    QAction * cirAct3 = new QAction(QIcon(":/icons/picture/Circle.png"),"三点画圆");
    circleMenu->addAction(cirAct1);
    circleMenu->addAction(cirAct2);
    circleMenu->addAction(cirAct3);
    circleTB->setMenu(circleMenu);              		// 把菜单添加到QToolButton
    connect(cirAct1,&QAction::triggered,this,&MainWindow::cirAct1_triggered);
    connect(cirAct2,&QAction::triggered,this,&MainWindow::cirAct2_triggered);
    connect(cirAct3,&QAction::triggered,this,&MainWindow::cirAct3_triggered);
    drawHL1->addWidget(circleTB);

    QHBoxLayout *drawHL = new QHBoxLayout;
    drawHL->setAlignment(Qt::AlignLeft);
    drawHL->setAlignment(Qt::AlignTop);
    drawHL->setContentsMargins(0,0,0,0);

    drawHL->addLayout(drawHL1);


    // 最后，把DrawTab的布局设计成刚才创建的布局
ui->DrawTab->setLayout(drawHL);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionNew_triggered()
{
    //新建一个文件，也就是要把主链表清空，但在此之前，提示用户是否保存
    int ret = QMessageBox::warning(this, "Warning",
                                   "你的图形是否保存?",
                                   QMessageBox::Ok | QMessageBox::Cancel);
    if(ret == QMessageBox::Ok)
        m_MainList.clear();
}


void MainWindow::on_actionOpen_triggered()
{
    // 打开一个文件之前，也需要判断是否保存当前文件，我们将在以后的学习中添加
    QString curPath = QDir::currentPath();   // 获得当前程序所在的目录
    QString aFileName = QFileDialog::getOpenFileName(this,"选择一个图形文件",curPath,"CAD文件(*.*)");
    if(!aFileName.isEmpty())
        qDebug()<<"把文件内容读入到m_MainList中";
}


void MainWindow::on_actionSave_triggered()
{
    // 保存一个文件
    QString curPath = QDir::currentPath();
    QString aFileName = QFileDialog::getSaveFileName(this,"输入一个图形文件名称",curPath,"CAD文件(*.*)");
    if(!aFileName.isEmpty())
        qDebug()<<"把m_MainList中的对象写入到 : "<< aFileName;
}


void MainWindow::on_actionSaveAs_triggered()
{
    // 另存一个文件
    QString curPath = QDir::currentPath();
    QString aFileName = QFileDialog::getSaveFileName(this,"输入一个图形文件名称",curPath,"CAD文件(*.*)");
    if(!aFileName.isEmpty())
        qDebug()<<"把m_MainList中的对象写入到 : "<< aFileName;
}


void MainWindow::on_actionExit_triggered()
{
    // 退出程序之前，需要检查文件是否保存，我们将在以后的学习中添加代码
    this->close();   //  退出窗口应用程序
}

void MainWindow::pointTB_clicked()
{
    curDrawType = DPoint;
}

void MainWindow::lineTB_clicked()
{
    curDrawType = DLine;
}

void MainWindow::cirAct1_triggered() {
    curDrawType = DCircleone;  // 自定义一个枚举值，比如 21
    qDebug() << "两点直径画圆模式";
    // 这里可以设置鼠标交互逻辑
}

void MainWindow::cirAct2_triggered() {
    curDrawType = DCircletwo; // 比如 22
    qDebug() << "半径圆心画圆模式";
}

void MainWindow::cirAct3_triggered() {
    curDrawType = DCircle; // 比如 23
    qDebug() << "三点画圆模式";
}
void MainWindow::rectangleTB_clicked(){
    curDrawType = DRectangle;
}
bool isFirst=true;                  // 用于判断鼠标点击行为是第一点还是第二点
bool isSecond = false;
QPoint temppt;
QPoint temppt2;
QPoint temppt3;

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(curDrawType == DPoint)
    {
        DwgPoint* temppt = new DwgPoint;
        *temppt = event->pos();
        m_mainlist.append(temppt);
    }
    if(curDrawType == DLine)					// 判断当前绘制对象为直线
    {
        if(isFirst)
        {   temppt = event->pos();
            isFirst = false;
        }
        else
        {   DwgLine * templine = new DwgLine;
            templine->mStartPt = temppt;
            templine->mEndPt = event->pos();
            m_mainlist.append(templine);
            isFirst = true;
        }
    }
    if(curDrawType == DCircleone)
    {
        if(isFirst)
        {   temppt = event->pos();
            isFirst = false;
        }
        else
        {   DwgCircleone * tempcircle1 = new DwgCircleone;
            tempcircle1->Core = temppt;
            tempcircle1->Rad = event->pos();
            m_mainlist.append(tempcircle1);
            isFirst = true;
        }
    }
    if(curDrawType == DCircletwo)
    {
        if(isFirst)
        {   temppt = event->pos();
            isFirst = false;
        }
        else
        {   DwgCircletwo * tempcircle2 = new DwgCircletwo;
            tempcircle2->fPt = temppt;
            tempcircle2->bPt = event->pos();
            m_mainlist.append(tempcircle2);
            isFirst = true;
        }
    }
    if (curDrawType == DCircle)
    {
        if (isFirst)
        {
            temppt = event->pos();
            isFirst = false;
            isSecond = true;
        }
        else if (isSecond)
        {
            temppt2 = event->pos();
            isSecond = false;
        }
        else
        {
            DwgCircle * circle = new DwgCircle;
            circle->mPoint1 = temppt;
            circle->mPoint2 = temppt2;
            circle->mPoint3 = event->pos();
            m_mainlist.append(circle);
            isFirst = true;
            update();
        }
    }
    if(curDrawType == DRectangle)
    {

        if(isFirst)
        {   temppt = event->pos();
            isFirst = false;
        }
        else
        {   DwgRectangle * temprectangle = new DwgRectangle;
            temprectangle->p1 = temppt;
            temprectangle->p2 = event->pos();
            m_mainlist.append(temprectangle);
            isFirst = true;
        }
    }

    update();
}





void MainWindow::paintEvent(QPaintEvent *event)
{
    m_painter = new QPainter(this);
    for(auto& i : m_mainlist)
        i->Draw(m_painter);
}


void MainWindow::on_actionRoatate_triggered()
{

}


void MainWindow::on_actionCopy_triggered()
{

}


void MainWindow::on_actionMove_triggered()
{

}

